package qiniu.voidcepc.voicepc.demos.web.aliyunllm;

import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.tools.FunctionDefinition;
import com.alibaba.dashscope.tools.ToolBase;
import com.alibaba.dashscope.tools.ToolFunction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Component
public class GetGenerationParam {

    @Value("${aliyun.llmmodel}")
    private  String model;

    @Value("${aliyun.ApiKey}")
    private String apiKey;

    @Autowired
    private List<Message> messages;

    public GenerationParam getParam(String userInput, List<FunctionDefinition> functions) {
        // 创建一个新的消息列表副本，避免修改全局messages列表
        List<Message> messagesCopy = new ArrayList<>(messages);
        // 在副本中添加本次对话的内容
        messagesCopy.add(Message.builder().role(Role.USER.getValue()).content(userInput).build());
        messages.add(Message.builder().role(Role.USER.getValue()).content(userInput).build());
        // 构建工具列表，处理可能的多个函数定义
        List<ToolBase> toolBases = new ArrayList<>();
        for (FunctionDefinition func : functions) {
            toolBases.add(ToolFunction.builder().function(func).build());
        }
        
        return GenerationParam.builder()
                .model(model) // 指定需要调用的模型。
                .apiKey(apiKey) // 从环境变量中获取API Key。
                .messages(messagesCopy) // 传入消息列表副本
                .tools(toolBases) // 传入可用的工具列表。
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();
    }
}
